package com.chen.base.utils;

import cn.hutool.core.collection.CollectionUtil;
import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.function.Function;

/**
 * dozer 转换器
 *
 * @author 陈锦龙
 * @since 2021/9/13
 */
@Slf4j
public class ConvertUtil {

	/**
	 * List 深度转换器
	 * @param sourceList 源数据
	 * @param clz 目标类对象
	 * @return clz的对象
	 */
	public static <T, S> List<T> convertor(List<S> sourceList, Class<T> clz) {
		List<T> list = new ArrayList<>();
		if (CollectionUtil.isNotEmpty(sourceList)) {
			sourceList.forEach(s -> list.add(convertor(s, clz)));
		}
		return list;
	}

	/**
	 * 实体类 深度转换器
	 * @param source 源数据
	 * @param clz 目标类对象
	 * @return clz的对象
	 */
	@SneakyThrows
	public static <T, S> T convertor(S source, Class<T> clz) {
		T t = clz.newInstance();
		if (source != null) {
			convertor(source, t);
		}
		return t;
	}

	/**
	 * 实体类 深度转换器
	 * @param source 源数据
	 * @param object 目标对象
	 */
	public static <S, T> void convertor(S source, T object) {
		if (source != null && object != null){
			BeanUtils.copyProperties(source, object);
		}
	}

	/**
	 * list 转 map
	 */
	public static <T, K, V> Map<K, V> listToMap(List<T> list, Function<T, ? extends K> key, Function<T, ? extends V> value){
		Map<K, V> map = new HashMap<>();
		if (CollectionUtil.isNotEmpty(list)){
			list.forEach(t -> map.put(key.apply(t), value.apply(t)));
		}
		return map;
	}

	/**
	 * list 转 map
	 */
	public static <T, K> Map<K, T> listToMap(List<T> list, Function<T, ? extends K> key){
		return listToMap(list, key, t -> t);
	}
}